-- prop
-- create by weism
-- 技能带来一条附加属性
--     prop(1,20,5)：第一个参数为prop_id、第二个参数为prop的数值、第三个参数为回合数（如果没有默认为一直起效）
-- 附加属性都记录在目标的prop/skill字段下，战斗开始或结束时将被删除，每回合开始时处理一遍(过期的删掉)

return {
    apply = function(source, target, skillId, round, para, extra)
        local effectRound = -1;
        extra = extra or {};
        local lastRound = extra.lastRound;

        if type(lastRound) == "number" then
            effectRound = round + lastRound;
        elseif para[4] > 0 then
            effectRound = round + para[4];
        end

        local prop = { para[1], para[2], para[3], effectRound, }

        -- 增加命中动作
        --SkillM.getSequence():hit(source, target, skillId);

        -- 记录属性
        PropM.record(target, prop, "skill")

        -- 作用目标
        return { target, };
    end,

    parse = function(desc)
        local arr = string.explode(desc, ",");
        return { tonumber(arr[1]), arr[2], tonumber(arr[3]), tonumber(arr[4] or -1), };
    end,

    -- 解析技能描述
    parseDesc = function(source, skillId, desc, para)
        -- 效果
        local v = para[3];

        if PropM.getRow(para[1])["type"] == PROP_TYPE_RATIO then
            -- 小数
            v = v / 10;
        end

        -- 有部分prop属性是在基础值上增加，需要特殊处理
        -- 直接取prop的描述改动太大
        -- 没想到好的办法
        if para[1] == 212 then
            -- 遗留宝物
            v = v + 1;
        end

        -- 幽灵船"无尽弹药"的特殊处理
        if para[1] == 560 and tonumber(para[2]) == 6201 then
            -- 次数增加
            v = v + 3;
        end

        -- 时间单位转换的特殊处理
        if para[1] == 244 then
            -- 分钟转小时
            v = v / 60;
        end

        -- 雷神之锤，增加概率
        if para[1] == 902 then
            -- 触发概率增加
            local specialProp = PropM.combine(ME.user, "prop_force_add", para[1]);
            if specialProp[3] > 0 then
                v = v + specialProp[3] / 10;
            end
        end

        -- 机帝神，增加百分比
        if para[1] == 439 or para[1] == 440 then
            -- 触发效果增加
            local specialProp = PropM.combine(ME.user, "prop_force_add", para[1]);
            if specialProp[3] > 0 then
                v = PropM.apply(specialProp, v);
            end
        end

        -- 终结者，优化点
        if para[1] == 456 then
            -- 加成
            local specialProp = PropM.combine(ME.user, "prop_force_add", para[1]);
            if specialProp[3] > 0 then
                v = PropM.apply(specialProp, v);
            end
        end

        -- 考虑到可能有多次配置的情况，一次只替换 1 条
        desc = string.gsub(desc, "{prop}", v, 1);

        desc = string.gsub(desc, "{round}", para[4], 1);

        -- 技能相关属性的处理
        if para[1] == 540 then
            -- 技能转化的属性
            -- 施放技能
            local castSkill = SkillM.query(tonumber(para[2]), "name") or "";

            -- 转化技能
            local convertSkill = SkillM.query(para[4], "name") or "";

            desc = string.gsub(desc, "{cast}", castSkill, 1);
            desc = string.gsub(desc, "{convert}", convertSkill, 1);
        end

        local specialProps =  { 27, 514, 724, };
        if table.indexOf(specialProps, para[1]) ~= -1 then
            -- 需要用prop[2]替换一个数据的属性
            desc = string.gsub(desc, "{amount}", para[2], 1);
        end

        local specialPropsRatio =  { 498, 565, 757, };
        if table.indexOf(specialPropsRatio, para[1]) ~= -1 then
            -- 需要用prop[2]替换一个概率类数据的属性
            desc = string.gsub(desc, "{rate}", para[2] / 10, 1);
        end

        local skillProps =  { 8, 42, 43, 44, 46, 204, 226, 539, 902, };
        if table.indexOf(skillProps, para[1]) ~= -1 then
            local skill = SkillM.query(tonumber(para[2]), "name") or "";
            desc = string.gsub(desc, "{skill}", skill, 1);
        end

        -- 道具相关属性的处理
        local itemProps = { 21, 23, 230, 235, 245, 246, 251, 473, 544, 607, };
        if table.indexOf(itemProps, para[1]) ~= -1 then
            local classId = tonumber(para[2]);
            if para[1] == 21 or para[1] == 230 then
                -- 炼金材料合成需要显示合成后的材料，特殊处理
                classId = classId + 100;
            end
            local item = ItemM.query(classId, "name") or "";

            desc = string.gsub(desc, "{item}", item, 1);
        end

        -- 特殊道具名称
        itemProps = { 810, };
        if table.indexOf(itemProps, para[1]) ~= -1 then
            local reagentDesc = getLocStr("carriable_item");

            desc = string.gsub(desc, "{item}", reagentDesc, 1);
        end

        -- 数量相关属性的处理
        local itemProps = { 23, 245, 246, 472, 544, 607, };
        if table.indexOf(itemProps, para[1]) ~= -1 then
            if para[1] == 23 then
                v = v / 100;
            end

            desc = string.gsub(desc, "{amount}", v, 1);
        end

        -- 属性值相关属性的处理
        local attribProps = {1, 200, 236, 238, 607, 538, 573, 577, 578, 579, 1000, 1001, 1002 };
        if table.indexOf(attribProps, para[1]) ~= -1 then
            local attrib = FieldsM.getFieldName(para[2]) or "";
            desc = string.gsub(desc, "{attrib}", attrib, 1);
        end

        -- 冈布奥名称相关
        local slimeProps = { 235, 607,};
        if table.indexOf(slimeProps, para[1]) ~= -1 then
            local dungeonId = DungeonM.getDungeonId();
            if dungeonId > 0 then
                dungeonId = DungeonAreaM.getParentId(dungeonId);
                local slimeInfo = DungeonAreaM.getAreaSlime(dungeonId);
                local id = 1;
                if type(slimeInfo) == "table" and #table.keys(slimeInfo) > 0 then
                    id = table.values(slimeInfo)[1];
                end

                local name = PetM.query(id, "short_name");

                desc = string.gsub(desc, "{piece}", name, 1);
            end
        end

        -- 迷宫名称相关
        local areaProps = { 65,};
        if table.indexOf(areaProps, para[1]) ~= -1 then
            local dungeonId = tonumber(para[2]);
            local dungeonName = DungeonAreaM.query(dungeonId, "name");
            desc = string.gsub(desc, "{area}", dungeonName, 1);
        end

        -- 楼层描述的属性
        local floorProps =  { 544, };
        if table.indexOf(floorProps, para[1]) ~= -1 then
            -- 下楼获得卷轴，按阶位计算楼层
            local spellId = tonumber(para[2]);
            local rank = SpellM.query(spellId, "rank") or 1;
            local floor;
            if rank <= 1 then
                floor = "";
            elseif rank == 4 or spellId == 4055 then
                floor = 5;
            elseif rank >= 5 then
                floor = 20;
            else
                floor = rank;
            end

            desc = string.gsub(desc, "{floor}", floor, 1);
        end

        -- 数量楼层相关的属性
        local layerProps =  { 473, };
        if table.indexOf(layerProps, para[1]) ~= -1 then
            local floor  = math.max(1, math.modf(1000 / v));
            local amount = math.max(1, math.modf(v / 1000));
            if floor <= 1 then
                floor = "";
            end

            desc = string.gsub(desc, "{floor}", floor, 1);
            desc = string.gsub(desc, "{amount}", amount, 1);
        end

        -- 天赋增强装备的属性
        if para[1] == 815 then
            local classId = tonumber(para[2]);
            local equipName = ItemM.query(classId, "name");
            desc = string.gsub(desc, "{equip}", equipName, 1);

            local value = FormulaM.invoke("GET_TALENT_ADD_EQUIPS_VALUE", "equip", tonumber(para[2]), para[3]);
            for i = 1, #value do
                desc = string.gsub(desc, "{talent}", value[i], 1);
            end
        end

        -- 天赋增强套装的属性
        if para[1] == 816 then
            local classId = tonumber(para[2]);
            local suitName = SuitM.query(classId, "name");
            desc = string.gsub(desc, "{suit}", suitName, 1);

            local value = FormulaM.invoke("GET_TALENT_ADD_EQUIPS_VALUE", "suit", tonumber(para[2]), para[3]);
            for i = 1, #value do
                desc = string.gsub(desc, "{talent}", value[i], 1);
            end
        end

        -- 猛禽冈布奥，实在太特殊
        if para[1] == 598 then
            if tonumber(para[2]) == 30 then
                local value = para[3] * 5;
                desc = string.gsub(desc, "{raptor}", value, 1);
            end

            if tonumber(para[2]) == 33 then
                desc = string.gsub(desc, "{value}", para[3] * 3);
                desc = string.gsub(desc, "{value2}", para[3] * 10);
            end
        end

        return desc;
    end,
};
